    # Define multiboot header.
    .section .multiboot_header
    .long 0x1BADB002            /* magic */
    .long 0                     /* flags */
    .long -(0x1BADB002 + 0)     /* checksum */

    # The string to output.
    .data
        msg : .asciz "Helloworld, PB19071428-chenzhiyuan."

    .text
    .code32
    .globl start
start:
    # Initialize string first address, VGA start address, counter and serial port in turn.
    movb msg, %al
    movl $0xB8000, %ebx
    movl $0, %ecx
    movw $0x3F8, %dx

output:
    # Output a character on VGA and serial port.
	outb %al, %dx
    movb %al, (%ebx)

    # Update counter and VGA address
    incl %ecx
    addl $2, %ebx

    # Take the next character and judge.
    movb msg(%ecx), %al
    addb $0, %al
    jne output

    # Hlt
    hlt
